const { raw } = require('express')

module.exports = app => {
  const router = require('express').Router()
  const mongoose = require('mongoose')
  const Category = mongoose.model('Category')
  const Article = mongoose.model('Article')
  const Hero = mongoose.model('Hero')

  // 导入新闻数据
  router.get('/news/init', async (req, res) => {
    const parent = await Category.findOne({
      name: '新闻分类'
    })

    const cats = await Category.find().where({
      parent: parent
    }).lean()
    const newsTitles = ['QQ×王者荣耀6周年庆专场“峡谷游园会”开启！', '狄某有话说 |花木兰：你抓任你抓，我就在塔下！', '大神周年齐聚，解锁峡谷奥秘', '狄某有话说 |安琪拉：中路危险，草丛给我安全感', '王者荣耀×完美日记 峡谷四美眼影系列新品来啦', '11月2日体验服停机更新公告', '11月1日全服不停机更新公告', '10月30日登录匹配异常说明', '10月30日游戏内电视台直播奖励领取异常说明', '10月30日游戏内电视台直播异常说明', '桂花浮玉秋景无限，峡谷福利喜连连', '【蔷薇珍宝阁】活动开启公告', '周年祈愿-登录送永久开启公告及FAQ', '双倍返利活动开启公告', '“2021共创之夜”如期而至，第五波福利来袭，欢迎来到《王者荣耀》！', '虎牙HMA手游电竞大赛小组赛全面收官，晋级名额出炉！', '小组排位初露锋芒，大神杯正式进入全国大赛名额角逐战', '看全国大赛省赛直播，为家乡打call助阵!', 'KPL预报丨成都AG迎战MTG，谁能暂时稳住S组？', 'KPL预报丨外卖兄弟再相遇，武汉ES能否八连胜锁定季后赛？']
    const newsList = newsTitles.map(title => {
      const randomCats = cats.slice(0).sort((a, b) => Math.random() - 0.5)
      return {
        categories: randomCats.slice(0, 2),
        title: title
      }
    })
    await Article.deleteMany({})
    await Article.insertMany(newsList)
    res.send(newsList)
  })

  // 新闻列表接口
  router.get('/news/list', async (req, res) => {
    // const parent = await Category.findOne({
    //   name: '新闻分类'
    // }).populate({
    //   path: 'children',
    //   populate: {
    //     path: 'newsList'
    //   }
    // }).lean()

    const parent = await Category.findOne({
      name: '新闻分类'
    })
    const cats = await Category.aggregate([  //affregate 聚合查询
      { $match: { parent: parent._id } },
      {
        $lookup: {
          from: 'articles', //articles集合 是 这个模型 Artical的 小写复数形式
          localField: '_id',
          foreignField: 'categories',
          as: 'newsList'
        }
      },
      {
        $addFields: {
          newsList: { $slice: ['$newsList', 5] }
        }
      }
    ])

    // 从20条数据中任取5条给热门
    const subCats = cats.map(v => v._id)
    cats.unshift({
      name: '热门',
      newsList: await Article.find().where({
        categories: { $in: subCats }
      }).populate('categories').limit(5).lean()
    })

    cats.map(cat => {
      cat.newsList.map(news => {
        news.categoryName = cat.name === '热门' ? news.categories[0].name : cat.name
        return news
      })
      return cat
    })

    res.send(cats)
  })

  // 导入英雄数据
  router.get('/heroes/init', async (req, res) => {
    await Hero.deleteMany({})
    const rawData = require('./hero')

    for (let cat of rawData) {
      if (cat.name === '热门') {
        continue   //跳过此次循环
      }

      // 找到当前分类在数据库中对应的数据
      const category = await Category.findOne({
        name: cat.name
      })
      cat.heroes = cat.heroes.map(hero => {
        hero.categories = [category]
        return hero
      })
      // 录入英雄
      await Hero.insertMany(cat.heroes)
    }
    res.send(await Hero.find())
  })

  // 英雄列表接口
  router.get('/heroes/list', async (req, res) => {
    const parent = await Category.findOne({
      name: '英雄分类'
    })
    const cats = await Category.aggregate([  //affregate 聚合查询
      { $match: { parent: parent._id } },
      {
        $lookup: {
          from: 'heroes', //heroes 是 这个模型 Hero 的 小写复数形式
          localField: '_id',
          foreignField: 'categories',
          as: 'heroesList'
        }
      },
    ])

    // 从20条数据中任取5条给热门
    const subCats = cats.map(v => v._id)
    cats.unshift({
      name: '热门',
      heroesList: await Hero.find().where({
        categories: { $in: subCats }
      }).limit(10).lean()
    })

    res.send(cats)
  })

  // 文章详情接口
  router.get('/articles/:id', async (req, res) => {
    const data = await Article.findById(req.params.id).lean()
    // 相关资讯处理
    data.related = await Article.find().where({
      categories: {$in: data.categories},
      title: {$ne: Article.title}
    }).limit(2)
    res.send(data)
  })

  // 英雄详情
  router.get('/heroes/:id', async (req, res) => {
    const data = await Hero.findById(req.params.id)
    .populate('category').lean()
    res.send(data)
  })

  app.use('/web/api', router)
}